﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tibet.Datos;
using System.Data.SqlClient;
using System.Collections;
using Tibet.Entidades;
using System.Data;

namespace Tibet.Datos
{
    public class AccesoProyecto
    {
         #region Conexion
        /// <summary>
        /// Llamar a la clase de conexion
        /// <returns>devuelve la conexion</returns>

        Conexion bd = new Conexion();

        #endregion

        /// <summary>
        /// Metodo ConsultarProyectos encargado de cargar en la 
        /// interfaz los diferentes proyecto existentes en la BD
        /// </summary>
        /// <list type="Proyecto"></list>
        /// <returns>Lista de Usuarios</returns>
        public List<Proyecto> ConsultarProyectos()
        {
            //Boolean respuestaQuery = false;
            List<Proyecto> listaProyectos = new List<Proyecto>();
            //Tibet.Datos.Entidades.Proyecto proy = new Tibet.Datos.Entidades.Proyecto();
            SqlCommand command = new SqlCommand();

            try
            {
                
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELTodosLosProyectos]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                            
                SqlDataReader reader = command.ExecuteReader();
                
                 while (reader.Read())
                 {
                     Proyecto proy = new Proyecto();
                     proy.Id = reader.GetInt32(0);
                     proy.Nombre = reader.GetString(1);
                     listaProyectos.Add(proy);
                 }
                 reader.Close();
                 bd.CerrarConexionBd();

                 return listaProyectos;
                
            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }

            
        }

        /// <summary>
        /// Metodo ConsultarProyectosCulminados se encargado de 
        /// cargar en la interfaz los 
        /// diferentes proyecto existentes en la BD
        /// </summary>
        /// <list type="Proyecto"></list>
        /// <returns>Lista de Usuarios</returns>
        public List<Proyecto> ConsultarTodosProyectosCulminados()
        {
            //Boolean respuestaQuery = false;
            List<Proyecto> listaProyectos = new List<Proyecto>();
            //Tibet.Datos.Entidades.Proyecto proy = new Tibet.Datos.Entidades.Proyecto();
            SqlCommand command = new SqlCommand();

            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELTodosProyectosCulminados]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;


                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Proyecto proy = new Proyecto();
                    proy.Id = reader.GetInt32(0);
                    proy.Nombre = reader.GetString(1);
                    listaProyectos.Add(proy);
                }
                reader.Close();
                bd.CerrarConexionBd();

                return listaProyectos;

            }

            catch (SqlException)
            {
                //bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                //bd.CerrarConexionBd();
                return null;
            }

            finally            
            {
                bd.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Metodo ConsultarProyectosCulminados se encargado de 
        /// cargar en la interfaz los 
        /// diferentes proyecto existentes en la BD
        /// </summary>
        /// <list type="Proyecto"></list>
        /// <returns>Lista de Usuarios</returns>
        public List<ErrorP> ConsultarProyectosCulminados()
        {
            //Boolean respuestaQuery = false;
            List<ErrorP> listaProyectos = new List<ErrorP>();
            //Tibet.Datos.Entidades.Proyecto proy = new Tibet.Datos.Entidades.Proyecto();
            SqlCommand command = new SqlCommand();

            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELProyectoCulminado]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;


                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {                
                    ErrorP error = new ErrorP();
                    error.NProyecto = reader["Proyecto"].ToString();
                    error.FechaI = reader.GetDateTime(1);
                    error.Mes = reader["Estatus"].ToString();
                    error.Cliente = reader["Cliente"].ToString();
                    error.Lider = reader["Lider"].ToString();
                    listaProyectos.Add(error);
                }
                reader.Close();
                bd.CerrarConexionBd();

                return listaProyectos;

            }

            catch (SqlException)
            {
                //bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                //bd.CerrarConexionBd();
                return null;
            }

            finally
            {
                bd.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Metodo ConsultarMetricas  
        /// 
        /// </summary>
        /// <list type="ErrorP"></list>
        /// <returns>Lista de errores</returns>
        public List<ErrorP> ConsultarMetricas(int idProy, string metrica, int mesSelec)
        {
            //Boolean respuestaQuery = false;
            List<ErrorP> listaProyectos = new List<ErrorP>();
          
            SqlCommand command = new SqlCommand();

            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELConsultaMetricasProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idProy", idProy);
                command.Parameters.AddWithValue("@name", metrica);
                command.Parameters.AddWithValue("@anio", mesSelec);
                 
                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    ErrorP error = new ErrorP();
                    error.Mes = reader.GetString(1);
                    error.Cant = reader.GetInt32(0);
                    error.Porcentaje = reader.GetInt32(2);
                    listaProyectos.Add(error);
                }
                reader.Close();
                bd.CerrarConexionBd();

                return listaProyectos;

            }

            catch (SqlException)
            {
                //bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                //bd.CerrarConexionBd();
                return null;
            }

            finally
            {
                bd.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Metodo ConsultarProyectosEnCurso se encargado de 
        /// cargar en la interfaz los 
        /// diferentes proyecto que se encuentran en curso
        /// hasta la fecha existentes en la BD
        /// </summary>
        /// <list type="Proyecto"></list>
        /// <returns>Lista de Usuarios</returns>
        public List<ErrorP> ConsultarProyectosEnCurso()
        {
            //Boolean respuestaQuery = false;
            List<ErrorP> listaProyectos = new List<ErrorP>();
            //Tibet.Datos.Entidades.Proyecto proy = new Tibet.Datos.Entidades.Proyecto();
            SqlCommand command = new SqlCommand();

            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELProyectoActivo]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;


                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    ErrorP error = new ErrorP();
                    error.NProyecto = reader["Proyecto"].ToString();
                    error.FechaI = reader.GetDateTime(1);
                    error.Mes = reader["Estatus"].ToString();
                    error.Cliente = reader["Cliente"].ToString();
                    error.Lider = reader["Lider"].ToString();
                    listaProyectos.Add(error);

                }
                reader.Close();
                bd.CerrarConexionBd();

                return listaProyectos;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }


        }

        /// <summary>
        /// Metodo ConsultarErroresPorProyectoss se encarga de 
        /// cargar en la interfaz los diferentes errores de un 
        /// proyecto en especifico y su 
        /// cantidad de erroresexistentes en la BD
        /// </summary>
        /// <param name="idProy"></param>
        /// <list type="ErrorP"></list>
        /// <returns>List<ErrorP></returns>
        public List<ErrorP> ConsultarErroresPorProyecto(int idProy, int anio)
        {
            //Boolean respuestaQuery = false;
            List<ErrorP> listaProyectos = new List<ErrorP>();
            
            SqlCommand command = new SqlCommand();

            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELConsultaLog]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idProy", idProy);
                command.Parameters.AddWithValue("@anio", anio);

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    ErrorP error = new ErrorP();
                    error.Cant = reader.GetInt32(0);
                    error.Porcentaje = reader.GetInt32(1);
                    error.Mes = reader.GetString(2);
                    listaProyectos.Add(error);
                    
                }
                reader.Close();
                bd.CerrarConexionBd();

                return listaProyectos;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }


        }

        /// <summary>
        /// Metodo ConsultarTodosProyectosPorCliente encargado de 
        /// consultar la cantidad de proyectos por cliente en la BD
        /// </summary>
        /// <param name="idCli"></param>
        /// <list type="ErrorP"></list>
        /// <returns>List<ErrorP></returns>
        public List<ErrorP> ConsultarTodosProyectosPorCliente(int idCli)
        {
            //Boolean respuestaQuery = false;
            List<ErrorP> listaProyectos = new List<ErrorP>();

            SqlCommand command = new SqlCommand();

            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELProyectoPorCliente]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idCliente", idCli);

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    ErrorP error = new ErrorP();
                    error.NProyecto = reader["Proyecto"].ToString();
                    error.FechaI = reader.GetDateTime(1);
                    error.Mes = reader["Estatus"].ToString();
                    error.Cliente = reader["Cliente"].ToString();
                    error.Lider = reader["Lider"].ToString();
                    listaProyectos.Add(error);

                }
                reader.Close();
                bd.CerrarConexionBd();

                return listaProyectos;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
        }

        public int AgregarProyecto(Proyecto proyecto)
        {

            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[INSProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@NombreProyecto", proyecto.Nombre);
                command.Parameters.AddWithValue("@Estatus", proyecto.Estatus);
                command.Parameters.AddWithValue("@Ruta", proyecto.Ruta);
                command.Parameters.AddWithValue("@Dias", proyecto.Dias);
                command.Parameters.AddWithValue("@Fk_Perfil_Regla_idPerfil_Regla",
                    proyecto.IdPerfilRegla);
                command.Parameters.AddWithValue("@Fk_Perfil_Metrica_idPerfil_Metrica",
                    proyecto.IdPerfilMetrica);
                command.Parameters.AddWithValue("@Fk_Cliente_idCliente", proyecto.IdCliente);

                SqlDataReader reader = command.ExecuteReader();
                if (reader.Read())
                {
                    return (int)reader[0];

                }
                reader.Close();
                bd.CerrarConexionBd();
                return -1;
            }
            catch (Exception e)
            {
                return -1;
            }
        }


        //Siguiente Metodo Creado por Juan Carlos Quintero - MotorMetricas
        /// <summary>
        /// Metodo ConsultarTodosProyectos encargado de obtener los proyectos para
        /// para comprobar que proyectos se deben pasar las metricas
        /// </summary>
        /// <list type="Proyecto"></list>
        /// <returns>Lista de Proyectos</returns>
        public List<Proyecto> ConsultarTodosProyectos()
        {
            List<Proyecto> proyectos = new List<Proyecto>();
            //Conexion bd = InstanciarConexion();
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();

                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELTodosLosProyectos]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Proyecto proyecto = new Proyecto();
                    Fecha fecha = new Fecha();
                    proyecto.Id = reader.GetInt32(0);
                    proyecto.Nombre= reader["NombreProyecto"].ToString();
                    proyecto.Estatus = reader["Estatus"].ToString();
                    proyecto.Ruta = reader["Ruta"].ToString();
                    proyecto.Dias = reader.GetInt32(4);
                    proyecto.IdPerfilMetrica = reader.GetInt32(5);
                    
                    fecha.Fecha1 = DateTime.Parse(reader["Fecha"].ToString());
                    proyecto.Fechas.Add(fecha);
                    proyectos.Add(proyecto);
                }


                reader.Close();
                bd.CerrarConexionBd();
                return proyectos;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
        }

        public List<Tibet.Entidades.Proyecto> BuscarProyecto()
        {
            List<Proyecto> listaProyectos = new List<Proyecto>();
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELTodosProyectosEnCurso]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Proyecto proy = new Proyecto();
                    proy.Nombre = reader.GetString(0);
                    listaProyectos.Add(proy);
                }

                return listaProyectos;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }


            return listaProyectos;

        }

    }

    }

